/**
 * 游戏工具函数
 */
export const gameUtil = {
  /**
   * 调整颜色亮度
   * @param {string} color 颜色值 #RRGGBB
   * @param {number} amount 亮度倍数 (0-2)
   * @returns {string} 调整后的颜色
   */
  adjustBrightness(color, amount) {
    let r = parseInt(color.slice(1, 3), 16)
    let g = parseInt(color.slice(3, 5), 16)
    let b = parseInt(color.slice(5, 7), 16)

    r = Math.floor(r * amount)
    g = Math.floor(g * amount)
    b = Math.floor(b * amount)

    r = Math.min(255, Math.max(0, r))
    g = Math.min(255, Math.max(0, g))
    b = Math.min(255, Math.max(0, b))

    return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`
  },

  /**
   * 随机数生成器 - mulberry32算法
   * 相同种子产生相同序列
   * @param {number} seed 种子值
   * @returns {Function} 随机数生成函数
   */
  mulberry32(seed) {
    return function() {
      seed += 0x6D2B79F5
      let t = seed
      t = Math.imul(t ^ t >>> 15, t | 1)
      t ^= t + Math.imul(t ^ t >>> 7, t | 61)
      return ((t ^ t >>> 14) >>> 0) / 4294967296
    }
  },

  /**
   * 计算关卡积分
   * @param {Object} options 计算参数
   * @param {number} options.baseScore 基础积分
   * @param {number} options.stepsUsed 使用步数
   * @param {number} options.optimalSteps 最优步数
   * @param {number} options.hintsUsed 使用提示次数
   * @param {number} options.streak 连续通关数
   * @returns {number} 最终积分
   */
  calculateScore({
    baseScore,
    stepsUsed,
    optimalSteps,
    hintsUsed,
    streak
  }) {
    // 基础倍率：步数越少，倍率越高（最多1.5倍）
    const stepMultiplier = Math.min(1.5, optimalSteps / stepsUsed)
    
    // 提示惩罚：每次提示减少10%积分
    const hintPenalty = Math.max(0.5, 1 - (hintsUsed * 0.1))
    
    // 连续通关奖励：每连续通关1关增加5%，最多增加50%
    const streakBonus = 1 + Math.min(0.5, streak * 0.05)
    
    // 计算最终积分
    return Math.round(baseScore * stepMultiplier * hintPenalty * streakBonus)
  },

  /**
   * 查找连通区域（BFS算法）
   * @param {Array} grid 网格数据
   * @param {number} x 起始x坐标
   * @param {number} y 起始y坐标
   * @param {string} color 目标颜色
   * @param {Array} visited 已访问标记
   * @param {number} gridSize 网格大小
   * @returns {Array} 连通区域坐标数组
   */
  findConnectedRegion(grid, x, y, color, visited, gridSize) {
    if (x < 0 || x >= gridSize || y < 0 || y >= gridSize || visited[y][x] || grid[y][x] !== color) {
      return []
    }
    
    visited[y][x] = true
    const region = [{ x, y }]
    
    // 检查四个方向
    region.push(...this.findConnectedRegion(grid, x + 1, y, color, visited, gridSize))
    region.push(...this.findConnectedRegion(grid, x - 1, y, color, visited, gridSize))
    region.push(...this.findConnectedRegion(grid, x, y + 1, color, visited, gridSize))
    region.push(...this.findConnectedRegion(grid, x, y - 1, color, visited, gridSize))
    
    return region
  }
}

export default gameUtil